package mytree

import (
	"strconv"

	"gitee.com/hailib/mytree/errs"
)

// Id 分支的 id
type Id uint32

// max_id_value 分支 id 的最大值
const max_id_value = ^uint32(0)

// IdNil 不存在的 id
const IdNil Id = 0

// IdFromI64 将一个 int64 转为 id
func IdFromI64(i int64) (Id, Error) {
	if i < 0 || i > int64(max_id_value) {
		return IdNil, errs.New(errs.InvalidParam, 210901163012, "id out of range, id: %d", i)
	}
	return Id(i), nil
}

// IdFromU32 将一个 Uint32 转为 Id
func IdFromU32(i uint32) Id {
	return Id(i)
}

// IsNull 判断一个 id 是否为空
func (i Id) IsNull() bool {
	return i == 0
}

// String 将 Id 转为字符串
func (i Id) String() string {
	return strconv.FormatUint(uint64(i), 10)
}

// U32 将 id 转为 uint32
func (i Id) U32() uint32 {
	return uint32(i)
}

// U64 将 id 转为 uint64
func (i Id) U64() uint64 {
	return uint64(i)
}

// I64 将 id 转为 int64
func (i Id) I64() int64 {
	return int64(i)
}

// TrimId 对 Id 列表进行去重
func TrimId(ids []Id) []Id {
	m := make(map[Id]bool)
	for _, id := range ids {
		m[id] = true
	}
	list := make([]Id, 0)

	for id := range m {
		list = append(list, id)
	}
	return list
}

// IdList 列表，用于拓展一些方法
type IdList []Id

func (l IdList) Len() int {
	return len(l)
}

func (l IdList) Less(i, j int) bool {
	return l[i] < l[j]
}

func (l IdList) Swap(i, j int) {
	t := l[i]
	l[i] = l[j]
	l[j] = t
}
